package com.study.inoutputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.junit.Test;

/**
* @Name: FileInputStreamTest
* @Description: 文件字节输入流测试类
* FileInputStream类：
	* 字节输入流操作步骤：
	* 	1、创建字节输入流对象；
	* 	2、读数据；
	* 	3、释放资源；
	* 1、创建字节输入流对象
	* 	构造方法：
	* 		public FileInputStream(File file)   通过打开一个到实际文件的连接来创建一个 FileInputStream，该文件通过文件系统中的 File 对象 file 指定。
	* 		public FileInputStream(String name)     通过打开一个到实际文件的连接来创建一个 FileInputStream，该文件通过文件系统中的路径名 name 指定。
	* 2、读数据
	* 	public int read() 从此输入流中读取一个数据字节。如果没有输入可用，则此方法将阻塞。 
	* 					（重点）说明：返回下一个数据字节；如果已到达文件末尾，则返回 -1。 
	* 	public int read(byte[] b) 从此输入流中将最多 b.length个字节的数据读入一个 byte 数组中。在某些输入可用之前，此方法将阻塞。 
	* 					（重点）说明：返回读入缓冲区的字节总数，如果因为已经到达文件末尾而没有更多的数据，则返回 -1。 
	* 	public int read(byte[] b, int off, int len) 从此输入流中将最多 len个字节的数据读入一个 byte数组中。如果 len不为 0，则在输入可用之前，该方法将阻塞；否则，不读取任何字节并返回 0。
	* 					（重点）说明：返回读入缓冲区的字节总数，如果因为已经到达文件末尾而没有更多的数据，则返回 -1。 
	* 3、释放资源
	* 	public void close() 关闭此文件输入流并释放与此流有关的所有系统资源。 
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-15 下午2:48:39 
* @Version: V1.0
 */
public class FileInputStreamTest {
	
	/**
	* @Name: fileInputStream01
	* @Description: FileInputStream类测试方法（每次读取单个字节）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午3:06:09
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void fileInputStream01() {
		//声明文件字节输入流对象
		FileInputStream fis = null ;
		try {
			//实例化文件字节输入流对象
			fis = new FileInputStream("fos.txt") ;
			//读单个字节：第一次读取
			int read = fis.read() ; //读取单个字符：104
			char ch = (char) read ; //将读取到的字节转换成字符：104->h
			System.out.println(read + "->" +ch);
			//读单个字节：第二次读取
			//说明：继续读取，fis对象的游标自动定位到文件内容的下一个字符
			read = fis.read() ; //读取单个字符：101
			ch = (char) read ; //将读取到的字节转换成字符：101->e
			System.out.println(read + "->" +ch);
			//读单个字节：第三次读取
			//说明：继续读取，fis对象的游标自动定位到文件内容的下一个字符
			read = fis.read() ; //读取单个字符：108
			ch = (char) read ; //将读取到的字节转换成字符：108->l
			System.out.println(read + "->" +ch);
			//读单个字节：第四次读取
			//说明：继续读取，当读到文件末尾时，fis读取的内容为-1，说明文件内容读取完毕
			read = fis.read() ; //读取单个字符：-1
			if(read == -1) {
				System.out.println("内容读取完毕");
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace() ;
		} catch (IOException e) {
			e.printStackTrace() ;
		} finally {
			//释放资源
			if(fis != null) {
				try {
					fis.close() ;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	* @Name: fileInputStream01
	* @Description: FileInputStream类测试方法（每次读取单个字节，循环读取文件中的所有内容）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午3:06:09
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void fileInputStream02() {
		//声明文件字节输入流对象
		FileInputStream fis = null ;
		try {
			//实例化文件字节输入流对象
			fis = new FileInputStream("fos.txt") ;
			int by = 0 ;
			//读取文件字节内容，赋给by，判断是否到文件末尾
			while((by = fis.read()) != -1) {
				System.out.print((char)by);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace() ;
		} catch (IOException e) {
			e.printStackTrace() ;
		} finally {
			//释放资源
			if(fis != null) {
				try {
					fis.close() ;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	* @Name: fileInputStream03
	* @Description: FileInputStream类测试方法（每次读取一个字节数组）
	* 	public int read(byte[] b) 从此输入流中将最多 b.length个字节的数据读入一个 byte 数组中。在某些输入可用之前，此方法将阻塞。 
	* 					（重点）说明：返回读入缓冲区的实际字节个数，如果因为已经到达文件末尾而没有更多的数据，则返回 -1。 
	* 	public int read(byte[] b, int off, int len) 从此输入流中将最多 len个字节的数据读入一个 byte数组中。如果 len不为 0，则在输入可用之前，该方法将阻塞；否则，不读取任何字节并返回 0。
	* 					（重点）说明：返回读入缓冲区的实际字节个数，如果因为已经到达文件末尾而没有更多的数据，则返回 -1。 
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午3:50:28
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void fileInputStream03() throws IOException{
		//创建文件字节输入流对象
		FileInputStream fis = new FileInputStream("fos.txt") ;
		/**
		 * fos.txt文件的内容：
			  1	hello\r\n
			  2	world\r\n
			  3	java
		        读取文件内容：   len	buf
		                 第一次读取   5：	hello	-> 解决办法：new String(buf, 0, 3)  ->  hello
		                 第二次读取   5：	\r\nwor	-> 解决办法：new String(buf, 0, 3)  ->  \r\nwor
		                 第三次读取   5：	ld\r\nj	-> 解决办法：new String(buf, 0, 3)  ->  ld\r\nj
		                 第四次读取   3 ：	ava\nj  -> 解决办法：new String(buf, 0, 3)  ->  ava
		                 第五次读取-1： 	ava\nj  -> 解决办法：new String(buf, 0, -1)  ->  将会报错 		->	判断文件是否读取结束
		                 java.lang.StringIndexOutOfBoundsException: String index out of range: -1
		 */
		//读取文件内容：第一次读取
		byte[] buf = new byte[5] ;
		int len = fis.read(buf) ;
//		System.out.println(len + " : " + new String(buf));
		System.out.println(len + " : " + new String(buf, 0, len));
		//读取文件内容：第二次读取
		len = fis.read(buf) ;
//		System.out.println(len + " : " + new String(buf));
		System.out.println(len + " : " + new String(buf, 0, len));
		//读取文件内容：第三次读取
		len = fis.read(buf) ;
//		System.out.println(len + " : " + new String(buf));
		System.out.println(len + " : " + new String(buf, 0, len));
		//读取文件内容：第四次读取
		len = fis.read(buf) ;
//		System.out.println(len + " : " + new String(buf));
		System.out.println(len + " : " + new String(buf, 0, len));
		//读取文件内容：第五次读取
		len = fis.read(buf) ;
//		System.out.println(len + " : " + new String(buf));
//		System.out.println(len + " : " + new String(buf, 0, len));
		//判断文件是否读取结束
		if(len == -1) {
			System.out.println("文件读取结束！");
		}
		//释放资源
		fis.close() ;
	}
	
	/**
	* @Name: fileInputStream03
	* @Description: FileInputStream类测试方法（每次读取一个字节数组，循环读取文件中的所有内容）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午3:50:28
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void fileInputStream04() throws IOException{
		//创建文件字节输入流对象
		FileInputStream fis = new FileInputStream("fos.txt") ;
		byte[] buf = new byte[1024] ;
		int len = 0 ;
		while((len = fis.read(buf)) != -1) {
			System.out.print(new String(buf, 0, len));
		}
		fis.close() ;
	}
	

}
